package product;

import javax.swing.*;

import java.awt.*;
import java.awt.event.*;

class GraphicsObjectEx extends JFrame {
	/*	
	int width, height;
	float value;
	float r;
	double angle;
	*/
	Container contentPane; // 컨테이너 생성
	int[] data = { 0, 0, 0,}; // 차트의 값 저장배열
	int[] arrange = new int[3];

	Color[] color = { Color.GREEN, Color.red, // 색상
			Color.blue, Color.MAGENTA };
	
/*	Color lineColor;
	Color arcColor;
	
	Ellipse2D.Float outCircle;
	Ellipse2D.Float outFillCircle;*/
	
	
	String[] itemName = { "생산량", "판매량", "재고량"}; // 비교대상

	JTextField[] tf = new JTextField[3]; // 텍스트필드
	ChartPanel chartPanel = new ChartPanel(); // 차트패널

	public GraphicsObjectEx(int sale, int stock) { // 생성자
		this.data[1]=sale;
		this.data[2]=stock;
		this.data[0]=sale+stock;
		setTitle("전체 생산, 판매, 재고량");
		setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
		contentPane = getContentPane(); // 컨테이너 갯
		contentPane.add(new InputPanel(), BorderLayout.NORTH);
		contentPane.add(chartPanel, BorderLayout.CENTER);
		setSize(500, 350);
		setVisible(true);
		drawChart(); // 차트 메소드 호출
	}
	

	void drawChart() { // 차트를 그린다
		int sum = 0; // 초기값 0
		for (int i = 1; i < data.length; i++) { // 데이터 값만큼 루프
//			data[i] = Integer.parseInt(tf[i].getText()); //set으로 받아온다
			tf[i].setText(data[i]+"");
			sum += data[i];
		}
		if (sum == 0)
			return;

		for (int i = 1; i < data.length; i++) {
			arrange[i] = (int) Math
					.round((double) data[i] / (double) sum * 360);
			chartPanel.repaint(); // 차트패널의 PAINT호출
		}
		tf[0].setText(data[1]+data[2]+"");
	}

	class InputPanel extends JPanel { // 입력패널
		public InputPanel() {
			this.setBackground(Color.LIGHT_GRAY); // 배경

			for (int i = 0; i < tf.length; i++) { // 현 가진갯수만큼
				tf[i] = new JTextField("0", 5);
				tf[i].addActionListener(new MyActionListener()); // 리스너
				add(new JLabel(itemName[i]));
				add(tf[i]);
			}
		}
	}

	class MyActionListener implements ActionListener { // 액션리스너
		@Override
		public void actionPerformed(ActionEvent e) { // 텍스트필드변화시
			JTextField t = (JTextField) e.getSource();
			int n;

			try {
				n = Integer.parseInt(t.getText());
			} catch (NumberFormatException ex) {
				t.setText("0");
				return;
			}
			drawChart(); // 호출
		}
	}

	class ChartPanel extends JPanel { // 차트 표시 패널

		@Override
		public void paintComponent(Graphics g) {

			super.paintComponent(g);// 부모 패인트호출
			Graphics2D g2 = (Graphics2D)g;
			
			g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
			g2.setStroke(new BasicStroke(15));
/*			g2.draw(outCircle);
			g.setColor(arcColor);*/
			
			int startAngle = 0;

			for (int i = 0; i < data.length; i++) {
				g.setColor(color[i]);
				g.drawString(
						itemName[i] + "" + Math.round(arrange[i] * 100 / 360)
								+ "%", 50 + i * 100, 20);
			}

			for (int i = 0; i < data.length; i++) {
				g.setColor(color[i]);
				g.fillArc(150, 50, 200, 200, startAngle, arrange[i]);
				startAngle = startAngle + arrange[i];
			}
		}
	}

/*	public static void main(String[] args) {
		new GraphicsObjectEx();
	}*/
}

/*
@Override


protected void onDraw(Canvas canvas){
    final float ZERO = -90f; //drawAcr를 이용하면 오른쪽이 0도가 된다. 일반적으로 가장 위를 0으로 보기 때문에 - 90도를 해준다.
    final float DOTONE = 72f; //이 소스에서는 5점이 만점이기 때문에 360/5를 해서 1점당 72도를 준다.
    float score = 3.8f; //점수. 하드코딩으로 넣었지만 나중에 변경 예정
    
    float degree = score * DOTONE;
    
    Paint p = new Paint(); //페인트 객체 p 생성
    p.setAntiAlias(true); //윤곽에 안티알리아싱을 처리해서 부드럽게 할건지 설정
    p.setStyle(Paint.Style.STROKE); //원의 윤곽선만 그리는 페인트 스타일
    p.setStrokeWidth(5); //윤곽선의 두께
    p.setAlpha(0x00); //배경 원의 투명도. 이 부분을 00으로 투명하게 처리하지 않으면 배경 원과 점수의 원이 다 보인다.

    RectF rectF = new RectF(100, 100, 400, 400); //사각형 객체 rectF를 생성하며 점수 원의 크기를 사각형으로 보고 (좌, 상, 우, 하) 좌표 설정. 좌상이 기준이 된다.

    if( a < 2 ) {
        p.setColor(Color.RED);
    }
    else if( a < 3 ) {
        p.setColor(Color.YELLOW);
    }
    else if( a < 4 ) {
        p.setColor(Color.BLUE);
    }
    else if( a <= 5 ) {
        p.setColor(Color.GREEN);
    } //점수에 맞춰 점수 원의 색을 변경한다.
    
    canvas.drawArc (rectF, ZERO, degree, false, p);  //점수 원(호)를 그리는 메소드. (정사각형 객체, 시작각도, 끝각도, 시작각도와 끝 각도에서의 중앙으로 선을 그을것이냐, 사용할 페인트 객체). 각도는 시계방향으로 증가한다.
*/

/*
 막대그래프 그리기
<H1>원 그래프를 위한 처리 단계</H1>먼저 그래프를 그리기 위한 그래프 렌더러 객체를 생성합니다. 
<PRE class="java" name="code">// 그래프 렌더러 생성
DefaultRenderer renderer = new DefaultRenderer();</PRE><BR>상단 
표시 제목과 글자 크기를 설정합니다. 
<PRE class="java" name="code">// 상단 표시 제목과 글자 크기
renderer.setChartTitle("2011 분기별 판매비율");
renderer.setChartTitleTextSize(35);</PRE><BR>위에서 
표로 정의했던 각 항목에 대한 데이터를 선언합니다. 
<PRE class="java" name="code">// 각 항목에 대한 데이터
double[] values = new double[] { 20, 40, 30, 10 };</PRE><BR>각 
항목별 이름을 지정합니다. 
<PRE class="java" name="code">// 각 항목별 문구 지정
CategorySeries series = new CategorySeries("분기별 실적");
series.add("1/4분기", values[0]);
series.add("2/4분기", values[1]);
series.add("3/4분기", values[2]);
series.add("4/4분기", values[3]);</PRE><BR>실행화면을 
보면 그래프의 근처에 함께 표시되는 회색 작은 글자가 있습니다. 항목별 이름을 표시하는 것입니다.<BR>그래프와 함께 표시되는 항목별 표시 
문구의 글자 크기를 지정합니다. 
<PRE class="java" name="code">// 그래프와 함께 표시되는 항목별 표시 문구의 글자 크기
renderer.setLabelsTextSize(15);</PRE><BR>하단부에 
표시되는 항목별 이름에 대한 글자 크기를 별도로 지정합니다. 
<PRE class="java" name="code">// 하단부에 표시되는 문구의 글자 크기
renderer.setLegendTextSize(25);</PRE><BR>각 
항목에 연결할 컬러 지정합니다. 그래프의 항목과 페이지 하단부의 항목이름에 적용되는 색상값 입니다. 
<PRE class="java" name="code">// 각 항목에 연결할 컬러 지정
int[] colors = new int[] { Color.BLUE, Color.GREEN, Color.MAGENTA, Color.YELLOW };
for (int color : colors) {
	SimpleSeriesRenderer r = new SimpleSeriesRenderer();
	r.setColor(color);
	renderer.addSeriesRenderer(r);
}</PRE><BR>
Zoom 버튼 표시 여부와 Zoom 기능 활성화를 지정합니다. 
<PRE class="java" name="code">// Zoom 버튼 표시 여부
renderer.setZoomButtonsVisible(true);
// Zoom 기능 활성화
renderer.setZoomEnabled(true);</PRE><BR>설정한 
내용을 토대로 그래프 View 형태로 얻어 LinearLayout에 추가합니다. 
<PRE class="java" name="code">// 그래프를 View로 얻어온다.
GraphicalView gv = ChartFactory.getPieChartView(this, series, renderer);

// 그래프의 화면 출력
LinearLayout llBody = (LinearLayout) findViewById(R.id.llBody);
llBody.addView(gv);</PRE><BR><BR><BR><STRONG><SPAN 
style="font-size: 11pt;"><EM>이제 즐깁시다~!!!</EM></SPAN></STRONG>
*/